Урок 7 – Процедурный стиль. Процедуры и функции

Как я уже писал, Pascal состоит из зарезервированных слов, идентификаторов, разделителей и т.д., а уже из этих элементов мы можем строить целые конструкции – например чтобы создать переменную мы использовали зарезервированное слово, идентификатор и разделители.

Сегодня мы изучим две более сложные конструкции – процедуры и функции.

Используя императивный стиль программисты вскоре заметили, что часто в одной программе они пишут несколько раз абсолютно одинаковый код, и тогда им в голову пришла идея: “А что если написать повторяющийся код один раз, присвоить ему имя, как переменной, и вызывать его только обращаясь к имени? Это бы сэкономило сотни строчек кода!”.

Так и появились процедуры и процедурный стиль программирования (писать код используя процедуры). Процедура – это подпрограмма, которая содержит в себе код, который вы хотите использовать неоднократно. Почему я написал, что процедура это подпрограмма? Дело в том, что она выглядит как отдельная программа со своими разделами: у нее также есть раздел с именем, описание и операторами. Только она находится внутри нашей программы, поэтому она называется подпрограммой.

Давайте напишем сразу 2 процедуры. Создадим новый файл с название shoppingList (список покупок) В названии я использовал стиль написания lowerCamelCase – это когда все слова пишутся слитно, но первое слово идет с маленькой буквы, а остальные с большой. И также назовем нашу программу.

Смысл программы будет в том, что она будет выводить список покупок в зависимости какой сегодня день недели.

Объявлять процедуры мы должны во втором разделе программы – разделе описания, как мы это делали с переменными. Если вы в разделе описания объявляете и процедуры и переменные, то не важно с чего вы начнете – с описания процедур или переменных, порядок не важен.

Итак, чтобы написать процедуру нам нужно воспользоваться зарезервированным словом procedure.

Затем мы указываем идентификатор имени процедуры, она будет называться WorkingDays (т.е. рабочие дни). Здесь я уже использовал стиль написания CamelCase – это когда все слова пишутся слитно и все с большой буквы, так как процедуры я привык писать именно с большой буквы.

Далее мы должны написать скобочки, где будут указаны параметры. О том что такое параметры, мы поговорим чуть позже, для нашей процедуры они не нужны, поэтому просто пишем пустые скобки и ставим точку с запятой.

Скобочку для параметров вы можете писать как слитно с именем процедуры, так и через пробел. На самом деле, если мы создаем процедуру без параметров, то пустые скобки можно и не писать, а оставить просто имя процедуры, но мы все же укажем пустые скобки, чтобы вы знали, что и так можно писать.

Итак, мы объявили и написали имя процедуры. У процедуры также есть раздел описания и раздел операторов. Сейчас нам раздел описания не нужен, напишем только раздел операторов.

Как вы заметили, после слова end я написал точку с запятой, а не точку, так как точка сразу завершит всю программу. Теперь пишем внутри этой процедуры операторы Write().

Давайте создадим еще одну процедуру под названием Weekends, т.е. список покупок на выходные.

Напишем третий раздел нашей программы ShoppingList и там воспользуемся двумя этими процедурами. Чтобы их вызвать надо воспользоваться оператором вызова процедур, для этого пишете имя процедуры, скобочки для параметров и точку с запятой:

Т.е. оператор Write() на самом деле тоже является процедурой! Только он создан не нами, а авторами программы и находится внутри этой программы. И его называют оператором вывода (об операторах мы поговорим позже, и тогда для вас все станет понятней).

Запускаем. И вот что получилось в выводе:

Какая-то куча-мала. Дело в том, когда мы используем оператор Write, все что мы с помощью него выводим, отображается на одной строчке. Т.е. первый оператор Write() вывел текст “Список покупок на понедельник:” и после этого курсор остался стоять после двоеточия в ожидании следующего оператора Write() т.д.

Но есть такой оператор, как Writeln(), который после вывода переводит курсор на следующую строчку, и уже другой оператор начинается с новой строки. Давайте заменим все операторы Write() на Writeln(). Для этого нажмите на комбинацию Ctrl+R, появится такое окно:

В поле искать пишем Write, а в поле заменить Writeln, и нажимаем на кнопку “Заменить все”. Готово. Теперь снова запускаем программу.

Так давайте еще создадим пробелы между списками покупок. Для этого просто в процедуре последним оператором введем пустой Writeln().

Получается, например, когда оператор Writeln(“Колбаса”) вывел свое слово и перевел курсор на следующую строку, пустой оператор Write() не выводит ничего, но также переводит курсор на следующую строку, так и получится пробел. Снова запускаем программу.

Все идеально!:) Т.е. вы поняли зачем нужна процедура.

Теперь давайте создадим процедуру с параметрами. Допустим мы хотим просто сложить два числа. Создаем новый файл addition (т.е. сложение).

Создадим две переменные, которые мы хотим сложить.

Теперь создадим процедуру addingTwoNumbers().

Только теперь в параметрах мы должны написать два параметра, т.е. что мы хотим складывать. Параметры внутри скобок пишутся так: идентификатор параметра : тип параметра. Если мы пишем два параметра, то просто разделяем их точкой с запятой.

Теперь напишем раздел операторов для процедуры addingTwoNumbers

Далее пишем раздел операторов уже для программы addition и присваиваем значения для переменных a и b.

Далее вызываем нашу процедуру и в параметрах передаем ей значения a и b, только теперь значения в параметрах отделяем запятой.

Теперь запускаем эту программы и мы увидим результат сложения.

Также говорят, когда мы определяем параметры в процедуре, что это формальные параметры, а когда мы вызываем процедуру и вносим туда значения, то мы вносим фактические параметры. Количество формальных и фактических параметров должно быть одинаковым, также у них должны быть одинаковые типы, т.е. если бы мы создали переменные a и b типа real, то мы не могли бы их использовать как фактические параметры для процедуры addingTwoNumbers.

Давайте теперь поговорим чуть больше о параметрах, а точнее о том какими они бывают. А они бывают двух типов: параметры-значения и параметры-переменные.

Когда мы создавали процедуру addingTwoNumbers, мы использовали параметры значения, т.е. когда мы указываем фактические параметры addingTwoNumbers(a,b), то процедура копирует именно значения в этих переменных, а не сами переменные.

А параметры переменные копируют именно адрес ячейки переменной, и тогда, если процедура изменит значение в этой ячейке, то она изменится и для самой переменной. Давайте напишем процедуру, которая меняет местами значения переменных а и b.

Создаем процедуру SwapsValues c двумя параметрами. Кстати, если два параметра имеют одинаковый тип, то их можно указывать через запятую. Процедуру addingTwoNumbers я написал с маленькой буквы, хотя обычно пишу процедуры с большой, процедуру SwapsValues я уже написал с большой.

Чтобы указать, что мы хотим использовать именно параметры-переменные, то нам необходимо перед параметром поставить ключевое слово var.

В данном случае ключевое слово var работает и для number1, и для number2. Чтобы поменять значение между двумя переменными, нам нужна будет третья переменная в процедуре. Давайте создадим ее во втором разделе процедуры.

Теперь набираем третий раздел процедуры, и первый действием присвоим переменной number3 значение number1.

Далее теперь присвоим переменной number1 значение number2.

И нам осталось последнее действие – присвоить переменной number2 значение number3.

Процедура готова. Давайте применим ее.

Теперь с помощью оператора Write, выедем значения а и b.

И вывод получим такой:

А если бы мы использовали параметры значения, то так поменять значения между a и b у нас не получилось. Давайте это проверим, просто у процедуры SwapsValues в формальных параметрах удалите ключевое слово var и снова запустите программу.

Как и ожидалось, изменения значений переменных a и b не произошло.

Вот мы с вами и разобрали, что такое процедура и процедурный стиль программирования. Как вы могли заметить, мы сейчас в программе addition использовали два стиля – процедурный и императивный, т.е. мы создали процедуру и в разделе операторов как самой процедуры так и всей программы последовательно указывали операторы. Т.е. невозможно использовать процедурный стиль без императивного. Поэтому императивный стиль является основным, а процедурный стиль – это под стиль императивного.

Итак, с процедурами мы разобрались, а что такое функция?

На самом деле функция очень похожа на процедуру, только с одним отличием – она возвращает какое-либо значение. Процедура и функция настолько похожи, что мы без особых проблем можем превратить процедуру addingTwoNumbers в функцию. Для начала заменим ключевое слово procedure на function.

Далее после параметров, через двоеточие укажем что за тип значения она будет возвращать.

И далее просто присвоим результат сложения функции.

Т.е. функция addingTwoNumbers будет содержать результат сложения, будто это тоже переменная. Функции в отличие от процедур, мы можем использовать как операнд, т.е. можем производить над ними математические операции, как с переменными, и присваивать переменным их значения и т.д. Т.е. использовать их везде, где мы используем переменные.

Например, давайте создадим третью переменную “c”.

И присвоим ей результат сложения, т.е. функцию addingTwoNumbers, и покажем значение ‘c’ в окне вывода.

Также мы можем в операторе Write также использовать нашу функцию.

Вот и все отличие процедур от функций. Надеюсь, было все понятно, а мы переходим к следующей лекции.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *